﻿#include "study10.h"
// C/C++ 标准库学习网站：https://legacy.cplusplus.com
// C/C++ 微软(Visual Studio)中文学习网站：https://learn.microsoft.com/zh-cn/cpp/cpp/?view=msvc-170

class Random {
public:
    Random(const Random& self) = delete; // 禁止拷贝构造函数

    static Random& get() { // 单例模式的实现
        static Random init_obj; // 静态变量 init，只初始化一次
        return init_obj;
    }

    static float float_rand_init() { // 随机数生成函数
        return get().init_float();
    }

    static float new_float_rand() { // 设置随机数种子
        return get().r_float = abs((std::chrono::high_resolution_clock::now().time_since_epoch().count() << 31) / 3 % 10000 / 10000.0f);
    }
private:
    Random() {} // 构造函数私有化，这里初始化随机数种子
    static Random init; // 静态类变量，只初始化一次

    float r_float = // 0 到 1 之间的随机数变量
        abs((std::chrono::high_resolution_clock::now().time_since_epoch().count() << 31) % 10000 / 10000.0f);

    float init_float() { return r_float; }
};

//Random Random::init; // 单例模式的实现，这里可以封装到类的 get() 函数中
//float f = init.rand_init().get(); // 调用单例模式的 rand_init() 函数

namespace RandomFloat { // 命名空间声明
    static float f = abs((std::chrono::high_resolution_clock::now().time_since_epoch().count() << 31) / 33 % 10000 / 10000.0f);
    static float& get_float() { return f; }
}

void test_singleton() {
    using namespace std; // 命名空间声明
    float f1 = Random::float_rand_init(); // 获得随机数，使用类的单例比较全面
    Random* r1 = &Random::get();
    Random* r2 = &Random::get();
    if (r1 == r2)
        cout << "r1 和 r2 指向同一个对象" << endl;
    else
        cout << "r1 和 r2 指向不同的对象" << endl;

    cout << "f1 = " << f1 << endl;
    cout << "new_float_rand() = " << Random::new_float_rand() << endl;

    // 命名空间实现单例：
    cout << "RandomFloat::new_float() = " << RandomFloat::get_float() << endl;
}